<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="eHtfi" id="eHtfi"><span data-lake-id="u19d5337f" id="u19d5337f">典型回答</span></h1>
  <p data-lake-id="u3994d040" id="u3994d040"><br></p>
  <p data-lake-id="u82360e2e" id="u82360e2e"><span data-lake-id="uf9cb69e1" id="uf9cb69e1">在 InnoDB 里，索引B+ Tree的叶子节点存储了整行数据的是主键索引，也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引，也被称之为非聚簇索引。</span></p>
  <p data-lake-id="u2a4bb993" id="u2a4bb993"><span data-lake-id="u20d65577" id="u20d65577">​</span><br></p>
  <p data-lake-id="ub26666a8" id="ub26666a8"><span data-lake-id="u224fc3ae" id="u224fc3ae">在存储的数据方面，主键（聚簇）索引的B+树的叶子节点直接就是我们要查询的整行数据了。而非主键（非聚簇）索引的叶子节点是主键的值。</span></p>
  <p data-lake-id="u56733ed8" id="u56733ed8"><span data-lake-id="u25e8f70c" id="u25e8f70c">​</span><br></p>
  <p data-lake-id="ub0fbaf61" id="ub0fbaf61"><span data-lake-id="ud87c2b39" id="ud87c2b39">那么，</span><strong><span data-lake-id="uaecf6c24" id="uaecf6c24">当我们根据非聚簇索引查询的时候，会先通过非聚簇索引查到主键的值，之后，还需要再通过主键的值再进行一次查询才能得到我们要查询的数据。而这个过程就叫做回表。</span></strong></p>
  <p data-lake-id="u456f5c19" id="u456f5c19"><span data-lake-id="ud9637af4" id="ud9637af4">​</span><br></p>
  <p data-lake-id="u9a0dd646" id="u9a0dd646"><span data-lake-id="u42251af6" id="u42251af6">所以，在InnoDB 中，</span><strong><span data-lake-id="u899f3351" id="u899f3351">使用主键查询</span></strong><span data-lake-id="u9218e1dd" id="u9218e1dd">的时候，是效率更高的， 因为这个过程不需要回表。另外，依赖</span><strong><span data-lake-id="u825b3d10" id="u825b3d10">覆盖索引</span></strong><span data-lake-id="uff291476" id="uff291476">、</span><strong><span data-lake-id="u2e9b8e8f" id="u2e9b8e8f">索引下推</span></strong><span data-lake-id="u6a356c27" id="u6a356c27">等技术，我们也可以通过优化索引结构以及SQL语句减少回表的次数。</span></p>
  <h1 data-lake-id="V7i2z" id="V7i2z"><span data-lake-id="u5bbe1b69" id="u5bbe1b69">扩展知识</span></h1>
  <p data-lake-id="uaf1a1771" id="uaf1a1771"><br></p>
  <h2 data-lake-id="XuqHB" id="XuqHB"><span data-lake-id="u749ca7c0" id="u749ca7c0">覆盖索引&amp;索引下推</span></h2>
  <p data-lake-id="uc2d206ed" id="uc2d206ed"><br></p>
 </body>
</html>